package controller

import (
	"RocFamilySystem/internal/service"
	"RocFamilySystem/models"
	"RocFamilySystem/pkg/constant"
	"RocFamilySystem/tools/cache"
	"errors"
	"fmt"
	"github.com/gin-gonic/gin"
	"strconv"
	"strings"
)

type SysRoleController struct {
	BaseController
	SysRoleService *service.SysRoleService
}

// 初始化
func init() {
	registerContainer["SysRoleController"] = &SysRoleController{}
}

// SetService 设置服务
func (controller *SysRoleController) SetService(sysSysRoleService *service.SysRoleService) {
	controller.SysRoleService = sysSysRoleService
}

// RegisterRouter 注册路由
func (controller *SysRoleController) RegisterRouter(engine *gin.Engine) {
	prefix := "/sysRole"
	g := engine.Group(prefix)
	prefixPermission := "permission" + strings.ReplaceAll(prefix, "/", ":")
	{
		//新增系统角色
		g.POST("", controller.AddSysRole)
		registerPermissionContainer("新增系统角色", prefixPermission+":create", prefix, "POST")
		//删除系统角色
		g.DELETE("/:id", controller.RemoveSysRole)
		registerPermissionContainer("ID删除系统角色", prefixPermission+":delete", prefix, "DELETE")
		g.DELETE("/batchDelete", controller.RemoveSysRole)
		registerPermissionContainer("批量删除系统角色", prefixPermission+":batchDelete", prefix, "DELETE")
		//修改系统角色
		g.PUT("", controller.ModifySysRole)
		registerPermissionContainer("修改系统角色", prefixPermission+":update", prefix, "PUT")
		//获取系统角色列表
		g.POST("/list", controller.QuerySysRole)
		registerPermissionContainer("查询系统角色列表", prefixPermission+":list", prefix, "POST")
		//通过ID查询系统角色
		g.GET("/:id", controller.QuerySysRoleById)
		registerPermissionContainer("ID查询系统角色", prefixPermission+":id", prefix, "GET")
		g.GET("/refresh", controller.LoadSysRouterPermissionCache)
		registerPermissionContainer("刷新系统角色", prefixPermission+":refresh", prefix, "GET")
	}
}

// AddSysRole 添加系统角色
// @Summary AddSysRole 添加系统角色
// @Tags 系统角色
// @Produce json
// @Param sysSysRole body models.SysRole true "系统角色"
// @Success 200 {object} Result "成功"
// @Router /sysRole [post]
func (controller *SysRoleController) AddSysRole(ctx *gin.Context) {
	var sysSysRole models.SysRole
	err := ctx.ShouldBind(&sysSysRole)
	controller.HandleError(err, constant.PARAMS_ERROR)
	controller.SysRoleService.AddSysRole(&sysSysRole)
	controller.CustomResult(ctx, 200, "添加系统角色成功", nil)
}

// RemoveSysRole 删除系统角色
// @Summary RemoveSysRole  删除系统角色
// @Tags 系统角色
// @Produce json
// @Param id path int true "系统角色id"
// @Success 200 {object} Result "成功"
// @Router /sysRole/:id [delete]
func (controller *SysRoleController) RemoveSysRole(ctx *gin.Context) {
	sysSysRoleId, err := strconv.Atoi(ctx.Param("id"))
	controller.HandleError(err, constant.PARAMS_ERROR)
	controller.SysRoleService.RemoveSysRole(sysSysRoleId)
	controller.CustomResult(ctx, 200, fmt.Sprintf("删除【%d】成功", sysSysRoleId), nil)
}

// RemoveSysRoleBatch 批量删除系统角色
// @Summary RemoveSysRole  批量删除系统角色
// @Tags 系统缓存
// @Produce json
// @Param ids[] query []int true "系统缓存id"
// @Success 200 {object} Result "成功"
// @Router /sysRole/batchDelete [delete]
func (controller *SysRoleController) RemoveSysRoleBatch(ctx *gin.Context) {
	ids := ctx.QueryArray("ids[]")
	if len(ids) == 0 {
		controller.HandleError(errors.New("参数缺失"), constant.PARAMS_ERROR)
	}
	controller.SysRoleService.RemoveSysRoleBatch(ids)
	controller.CustomResult(ctx, 200, fmt.Sprintf("删除【%v】成功", ids), nil)
}

// ModifySysRole 修改系统角色
// @Summary ModifySysRole 修改系统角色
// @Tags 系统角色
// @Produce json
// @Param sysSysRole body models.SysRole true "系统角色"
// @Success 200 {object} Result "成功"
// @Router /sysRole [put]
func (controller *SysRoleController) ModifySysRole(ctx *gin.Context) {
	var sysSysRole models.SysRole
	err := ctx.ShouldBind(&sysSysRole)
	controller.HandleError(err, constant.PARAMS_ERROR)
	controller.SysRoleService.ModifySysRole(&sysSysRole)
	controller.CustomResult(ctx, 200, fmt.Sprintf("修改【%d】成功", *sysSysRole.Id), nil)
}

// QuerySysRole 查询系统角色列表
// @Summary QuerySysRole 查询系统角色列表
// @Tags 系统角色
// @Produce json
// @Param sysSysRole body models.SysRole true "系统角色"
// @Success 200 {object} Result "成功"
// @Router /sysRole/list [post]
func (controller *SysRoleController) QuerySysRole(ctx *gin.Context) {
	pageNum, pageSize := controller.GetPageInfo(ctx)
	var sysSysRole models.SysRole
	err := ctx.ShouldBind(&sysSysRole)
	controller.HandleError(err, constant.PARAMS_ERROR)
	data := controller.SysRoleService.QuerySysRole(&sysSysRole, pageNum, pageSize)
	controller.SuccessResult(ctx, data)
}

// QuerySysRoleById 查询系统角色通过ID
// @Summary QuerySysRoleById  查询系统角色通过ID
// @Tags 系统角色
// @Produce json
// @Param id path int true "系统角色id"
// @Success 200 {object} Result "成功"
// @Router /sysRole/:id [get]
func (controller *SysRoleController) QuerySysRoleById(ctx *gin.Context) {
	sysSysRoleId, err := strconv.Atoi(ctx.Param("id"))
	controller.HandleError(err, constant.PARAMS_ERROR)
	data := controller.SysRoleService.QuerySysRoleById(sysSysRoleId)
	controller.SuccessResult(ctx, data)
}

// LoadSysRouterPermissionCache 刷新系统角色菜单权限
// @Summary LoadSysRouterPermissionCache   刷新系统角色菜单权限
// @Tags 系统角色
// @Produce json
// @Success 200 {object} Result "成功"
// @Router /sysRole/refresh [get]
func (controller *SysRoleController) LoadSysRouterPermissionCache(ctx *gin.Context) {
	cache.LoadSysRouterPermissionCache()
	controller.SuccessResult(ctx, nil)
}
